iT邦幫忙

1

Rust與AI/Python完美的結合 (2)

  • 分享至 

  • xImage
  •  

前言

上一篇【Rust與AI/Python完美的結合 (1)】介紹Rust與Python的整合,接著我們再來介紹【Rust與AI的整合】。

9/12 在【Hello World Dev Conference】介紹Rust,沒有太多時間討論Rust如何與AI的整合,也藉這篇文章補充說明。

機器學習開發流程

機器學習開發流程可以分為10大步驟,如下圖:
https://ithelp.ithome.com.tw/upload/images/20240916/20001976rFzFjTbGjS.png
說明如下:

  1. 蒐集資料:彙整為資料集(Dataset)。
  2. 資料清理(Data Cleaning)、資料探索與分析(Exploratory Data Analysis, EDA)。
  3. 特徵工程(Feature Engineering)。
  4. 資料切割(Data Split)。
  5. 選擇演算法(Learning Algorithms)。
  6. 模型訓練(Model Training)。
  7. 模型計分(Score Model)。
  8. 模型評估(Evaluate Model)。
  9. 佈署(Deploy)。
  10. 提供推論(Inference)服務。

步驟1~8屬於研發階段,必須反覆訓練模型,適合使用Python這類高生產力的語言開發,找到最佳模型後,步驟9~10會佈署至正式環境提供給客戶或使用者,進行模型推論,就不適合使用Python建構應用程式,因為:

  1. Python是直譯器,必須將原始程式碼交給客戶,大部分的軟體廠商都不願意吧,通常只會交付二進位的執行檔。
  2. 不能保證交付後不會被修改,屆時要除錯或版本控管的難度就很高了。
  3. Python的效能不如其他支援解譯器(Compiler)的程式語言。

基於以上原因,Python與Rust合作會是一個不錯的選擇,因為Rust還有其他的優勢:

  1. Rust的語法/觀念與Python相似,Python程式設計師很容易入手。
  2. Rust支援跨語言呼叫介面(FFI),很容易與其他程式語言整合,尤其是Python。

機器學習/深度學習套件

在狹義的機器學習方面,Linfa是一個不錯的選擇,支援大部分經典的演算法,如迴歸(Regression)、決策樹(Decision tree)、支援向量機(Support Vector Machine)、集群(Clustering)...等,參見下圖:
https://ithelp.ithome.com.tw/upload/images/20240916/20001976V2TqqlxVoD.png

至於支援深度學習的套件,較流行的有:

  1. tch-rs:與PyTorch介接的套件。
  2. Candle:HuggingFace開發的套件,可載入HuggingFace Hub擁有的35,000個模型。
  3. Burn:支援多後端(Backend)的套件,包括WGPU、Candle、LibTorch...等後端。

以下我們使用tch-rs實作深度學習專案。

tch-rs

要使用tch-rs,須安裝PyTorch C++/Java 函數庫,至PyTorch網站首頁下載程式,並解壓縮至c:\或d:\資料夾,可選擇CPU或GPU版,不過GPU版在Windows下測試並不順利,WSL或Linux則無問題。
tch-rs有許多範例,包括大語言模型(LLM)及Stable Diffusion等生成式AI模型,參閱下圖。
https://ithelp.ithome.com.tw/upload/images/20240916/20001976MkVOLvQ5zr.png

圖像辨識實作

  1. 先使用Python訓練模型並存檔,程式save_model.py如下:
import torch
import torchvision

# 載入 ResNet 模型
model = torchvision.models.resnet18(pretrained=True)

# 編譯模型並存檔
model.eval()
example = torch.rand(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example)
traced_script_module.save("model.pt")
  1. 執行:python save_model.py
  2. 執行結果:會產生模型檔model.pt。
  3. 開啟終端機或cmd,建立Rust專案,載入模型檔,並進行預測。
cargo new load_model
cd load_model
cargo add anyhow
cargo add tch
  1. src/main.rs內容如下:
use tch::Tensor;
use anyhow::Result;
use tch::{nn, nn::ModuleT, Device};
use std::env;
use tch::vision::{imagenet, resnet};
use anyhow::bail;

pub fn main() -> anyhow::Result<()> {
    // 參數1:模型檔名,參數2:預測圖檔名稱
    let args: Vec<_> = std::env::args().collect();
    let (model_file, image_file) = match args.as_slice() {
        [_, m, i] => (m.to_owned(), i.to_owned()),
        _ => bail!("usage: main model.pt image.jpg"),
    };
    
    // 載入模型檔,並進行預測
    let image = imagenet::load_image_and_resize224(image_file)?;
    let model = tch::CModule::load(model_file)?;
    let output = model.forward_ts(&[image.unsqueeze(0)])?.softmax(-1, tch::Kind::Float);
    // 顯示前5名物件名稱及機率
    for (probability, class) in imagenet::top(&output, 5).iter() {
        println!("{:50} {:5.2}%", class, 100.0 * probability)
    }
    Ok(())
}
  1. 執行前須先設定PyTorch C++/Java 函數庫路徑。
set LIBTORCH=C:\libtorch
set LIBTORCH_INCLUDE=C:\libtorch
set LIBTORCH_LIB=C:\libtorch
set LIBTORCH_BYPASS_VERSION_CHECK=1
set PATH=%PATH%;C:\libtorch;C:\libtorch\lib
  1. 執行:
cargo run ..\model.pt tiger.jpg
  1. 執行結果:
    tiger, Panthera tigris 61.70%
    tiger cat 38.13%
    tabby, tabby cat 0.05%
    jaguar, panther, Panthera onca, Felis onca 0.04%
    lynx, catamount 0.04%

YOLO 實作

使用YOLO模型進行物件偵測,與上一個專案程序類似,不同的是,直接訓練YOLO Darknet v3模型,並進行預測。由於程式碼較大,細節不作詳細說明,請參閱yolo_test專案。

  1. 執行前須先設定PyTorch C++/Java 函數庫路徑。
set LIBTORCH=C:\libtorch
set LIBTORCH_INCLUDE=C:\libtorch
set LIBTORCH_LIB=C:\libtorch
set LIBTORCH_BYPASS_VERSION_CHECK=1
set PATH=%PATH%;C:\libtorch;C:\libtorch\lib
  1. 執行:
cargo run ./yolo-v3.ot ./dog.jpg
  1. 執行結果:會顯示物件名稱及座標,並將註記的圖片存為output-00000.jpg。
    https://ithelp.ithome.com.tw/upload/images/20240916/20001976hc4XeUZS6F.png

https://ithelp.ithome.com.tw/upload/images/20240916/20001976bz6Rv31znM.jpg

結語

以上介紹Rust與Python/AI整合的方式,可進一步建構網站提供推論服務,透過並行處理(Concurrency)機制提升效能,相關實作可參閱【以Rust開發一個網站,不是網頁喔!】

工商廣告:)

Rust雖然具備諸多優點,但學習曲線陡峭,因此筆者最近剛完成【Rust 最佳入門與實戰】一書的撰寫,希望能與讀者分享Rust開發心得,內容除了Rust語言的入門、設計典範(Design patterns)外,也著重應用的探討,包括網頁、WebAssembly、桌面程式、資料庫、機器學習/深度學習、區塊鏈…等。
https://ithelp.ithome.com.tw/upload/images/20240817/20001976QxDOTVaiEa.jpg

本文相關範例放在這裡,【Rust 最佳入門與實戰】還有各式各樣的範例供大家下載。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言